package main

import (
	"encoding/json"
	"fmt"
	"time"
)

func main() {
	d := &Das{
		Id:      "1",
		Ts:      time.Now().UnixNano() / 1e6,
		Version: 2,
	}
	d.App = App{
		Name:     "test",
		Type:     "GB_Modbus_Poll_RTU_WXH_Test",
		DestType: "das",
		Flag:     "insert",
		LogLevel: "info",
		Desc:     "modbus rtu",
		Para:     nil,
		Channels: nil,
	}
	cs := make([]Channel, 1)
	cs[0] = Channel{
		Name:   "Channel1",
		Alisa:  "channel1",
		Desc:   "channel1",
		Flag:   "insert",
		Para:   nil,
		Points: nil,
	}
	m := make(map[string]string)
	m["source_serial"] = "COM1"
	m["source_serial_baudrate"] = "9600"
	m["source_serial_checkbit"] = "NONE"
	m["source_serial_databit"] = "8"
	m["source_serial_stopbit"] = "1"
	m["source_interval"] = "2000"
	m["d_ctrl"] = "true"
	cs[0].Para = m

	ps := make([]PointConf, 1)
	ps[0] = PointConf{
		Sn:       "test",
		Cn:       "channel1",
		Pn:       "p1",
		Gn:       "W3.DATAPOINT.P1",
		Ed:       "采集点1",
		Rt:       0,
		Sr:       "INT16",
		Ad:       "1.3.0",
		Ae:       0,
		Flag:     "insert",
		Isupload: 0,
		An:       "point1",
	}
	d.App.Channels = cs
	d.App.Channels[0].Points = ps
	buf, err := json.Marshal(d)
	if err == nil {
		fmt.Println(string(buf))
	}

}

type Das struct {
	Id      string `json:"id"`
	Ts      int64  `json:"ts"`
	Version int32  `json:"version"`
	App     App    `json:"app"`
}

type App struct {
	Name     string            `json:"name"`      //服务名
	Type     string            `json:"type"`      //驱动名
	DestType string            `json:"dest_type"` //服务类型
	Flag     string            `json:"flag"`      //flag--> insert 插入；update 更新； delete 删除
	LogLevel string            `json:"log_level"` //日志级别
	Desc     string            `json:"desc"`      //描述
	Para     map[string]string `json:"para"`      //配置参数
	Channels []Channel         `json:"channels"`  //通道
}

type Channel struct {
	Name   string            `json:"name"`           //名称
	Alisa  string            `json:"alisa"`          //别名
	Desc   string            `json:"desc,omitempty"` //描述
	Flag   string            `json:"flag"`           //flag--> insert 插入；update 更新； delete 删除
	Para   map[string]string //配置参数
	Points []PointConf       `json:"points"` //点组
}

type PointConf struct {
	//必填项
	Sn       string `json:"sn,omitempty"`       //服务名
	Cn       string `json:"cn,omitempty"`       //通道名
	Id       int32  `json:"id,omitempty"`       //点ID
	Pn       string `json:"pn,omitempty"`       //点名
	Gn       string `json:"gn,omitempty"`       //全点名
	An       string `json:"an,omitempty"`       //别名
	Ed       string `json:"ed,omitempty"`       //描述
	Rt       int32  `json:"rt,omitempty"`       //数据库类型
	Sr       string `json:"sr,omitempty"`       //采集类型
	Ad       string `json:"ad,omitempty"`       //采集地址
	Ae       int32  `json:"ae,omitempty"`       //控制属性 0只读；1只写；2读写
	Flag     string `json:"flag,omitempty"`     //操作标记 insert update delete
	Isupload int32  `json:"isupload,omitempty"` //是否上传

	//以下可不填
	Bv float32 `json:"bv,omitempty"`  //量程下限
	Tv float32 `json:"tv,omitempty"`  //量程上限
	Fk float32 `json:"fk,omitempty"`  //比例系数
	Fb float32 `json:"fb,omitempty"`  //偏移量
	Fm int32   `json:"fm,omitempty"`  //显示格式
	Pt int32   `json:"pt,omitempty"`  //来源
	Kt int32   `json:"kt,omitempty"`  //计算类型
	Ex string  `json:"ex,omitempty"`  //计算公式
	Ap int32   `json:"ap,omitempty"`  //报警级别
	Lc int32   `json:"lc,omitempty"`  //报警属性
	H4 float64 `json:"h_4,omitempty"` //报警高4限
	H3 float64 `json:"h_3,omitempty"` //报警高3限
	Zh float64 `json:"zh,omitempty"`  //报警高2限
	Hl float64 `json:"hl,omitempty"`  //报警高限
	Ll float64 `json:"ll,omitempty"`  //报警低限
	Zl float64 `json:"zl,omitempty"`  //报警低2限
	L3 float64 `json:"l_3,omitempty"` //报警低3限
	L4 float64 `json:"l_4,omitempty"` //报警低4限
	Kr string  `json:"kr,omitempty"`  //特征字
	Fq int32   `json:"fq,omitempty"`  //分辨率
	Eu string  `json:"eu,omitempty"`  //量纲
	Db float32 `json:"db,omitempty"`  //死区
	Dt int32   `json:"dt,omitempty"`  //死区类型
	Kz int32   `json:"kz,omitempty"`  //压缩类型
	Ct int32   `json:"ct,omitempty"`  //
}
